//
//  UITextView+EmoticonKeyboard.swift
//  表情键盘
//
//  Created by Apple on 16/7/30.
//  Copyright © 2016年 Apple. All rights reserved.
//

import UIKit

extension UITextView {
    
    /**
     获取传输给服务器的字符串, 图片会转成表情名称
     */
    func emoticonText() -> String {
//        print("获取textView要发送到服务器的内容: \(textView.attributedText)")
        // 属性文本是分段保存的.文本是一段,图片附件是一段,emoji是一段
        // 遍历属性文本里面的每一段
        
        var resutlString = ""
        // enumerationRange: NSRange: 去哪个范围迭代
        self.attributedText.enumerateAttributesInRange(NSRange(location: 0, length: self.attributedText.length), options: []) { (dict, range, _) -> Void in
            // UnsafeMutablePointer<ObjCBool>: 停止用的
            // 每次获取到一个元素就会调用这个闭包一次
            // 如果内容是图片字典里面带有 NSAttachment key
//            print("遍历内容:range: \(range), \(dict)")
            // 如果是图片,就使用图片名称
            if let attachment = dict["NSAttachment"] as? HMTextAttachment {
                // 获取图片名称
                let chs = attachment.chs
                
                // 将他们拼接起来
                resutlString += chs!
            } else {
                // 如果是文本就直接截取
                let str = (self.attributedText.string as NSString).substringWithRange(range)
                
                // 将他们拼接起来
                resutlString += str
            }
        }
        
        return resutlString
    }
    
    /// 添加表情到textView上面
    func insertEmoticon(model: HMEmoticonModel) {
        // 将内容添加到textView上面去
        
        // 设置内容
        if let emoji = model.emoji {
            self.insertText(emoji)
            return
        }
        
        if let fullPngPath = model.fullPngPath {
            // 图片表情,将图片添加到textView上面
            
            // 1.生成图片
            let image = UIImage(named: fullPngPath)
            
            // 属性文本可以添加附件
            // 2.将图片放到附件里面
            let attachment = HMTextAttachment()
            attachment.image = image
            
            // 表情名称,用于网络传输
            attachment.chs = model.chs
            
            // 获取文字的大小
            let imageWH = self.font?.lineHeight ?? 0
            
            // 设置附件的bounds
            // bounds 和 frame 的 origin 相反
            attachment.bounds = CGRect(x: 0, y: -4, width: imageWH, height: imageWH)
            
            // 3.用一个附件生成一个属性文本,如果不给属性文本添加Font属性,后续的图片会很小
            let attrText = NSAttributedString(attachment: attachment)
            // 3.1将附件的属性文本改成可变的属性文本,来添加Font属性
            let attrTextM = NSMutableAttributedString(attributedString: attrText)
            attrTextM.addAttribute(NSFontAttributeName, value: self.font!, range: NSRange(location: 0, length: 1))
            
            // 4.获取到textView上面当前的内容
            let currentAttrText = NSMutableAttributedString(attributedString: self.attributedText)
            
            // 5.获取到光标位置
            let currentSelectedRange = self.selectedRange
            
            // 6.将附件的属性文本添加到现有属性文本光标所在位置
            currentAttrText.replaceCharactersInRange(currentSelectedRange, withAttributedString: attrTextM)
            
            // 7.将属性文本赋值给textView
            self.attributedText = currentAttrText
            
            // 8.重新设置光标的位置
            self.selectedRange = NSRange(location: currentSelectedRange.location + 1, length: 0)
        }
    }
}
